package libdb;

import java.sql.*;
import java.util.*;
import libentity.*;



public class DbAccessor {

	// ATTRIBUTI
	java.sql.Connection dbConnection;
	private String connectionString = "";
	
	
	DBConnect con = new DBConnect('M');
	
	// METODI ACCESSORI
	public void setConnectionString(String connectionString) {
		this.connectionString = connectionString;
	}
	public String getConnectionString() {
		return connectionString;
	}
	
	// COSTRUTTORI
	public DbAccessor() {
		connectionString = con.getUrl();
	}
	
	public DbAccessor(String p_connectionString) {
		connectionString = p_connectionString;
	}
	
	
	// METODI 
	public void openConnectionToDB() {
		
		try {
			// allocazione del driver
			Class.forName (con.getDriver()).newInstance();

			// creazione della connessione
			dbConnection = DriverManager.getConnection(
					connectionString,
					con.getUser(),
					con.getPassword());
			
		}
		catch (ClassNotFoundException cnfe) {
			System.out.println("Driver not found!");
			System.out.println(cnfe.getMessage());
		}		
		catch (SQLException sqle) {
			System.out.println("Conessione al DB non riuscita!");
			System.out.println(sqle.getMessage());
		}
		catch (Exception e) {
			// gestire errore insolito
			System.out.println(e.getMessage());
		}
	} // end method
	
	public void closeConnectionToDB() {
		try {
			dbConnection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	} // end method
	
	// METODI PER LA RICERCA
	public ResultSet selectAll() {
		
		// imposta la query
		String sql_selectAll = "SELECT * FROM GANTT_MOV";
		
		// dichiara un resultSet
		ResultSet rs = null;

		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_selectAll);
			
			// esegue la query
			rs = comando.executeQuery();			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		// ritorna il risultato
		return rs;
	} // end method
	
	public ResultSet selectByChiave(
			String p_nomeChiave,
			String p_valoreChiave) {
		
		// imposta la query con il nome del campo usato come chiave
		String sql_selectByKey = "SELECT * FROM GANTT_MOV WHERE ("+p_nomeChiave+" = ?)";
		
		// dichiara un resultSet
		ResultSet rs = null;

		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_selectByKey);
			
			// inserisce il parametro
			comando.setString(1, p_valoreChiave);
			
			// esegue la query
			rs = comando.executeQuery();			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		// ritorna il risultato
		return rs;
	} // end method
	
	public ResultSet selectByID(
			int p_ID) {
		
		// imposta la query con il nome del campo usato come chiave
		String sql_selectByID = "SELECT * FROM GANTT_MOV WHERE (pID = ?)";
		
		// dichiara un resultSet
		ResultSet rs = null;

		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_selectByID);
			
			// inserisce il parametro
			comando.setInt(1, p_ID);
			
			// esegue la query
			rs = comando.executeQuery();			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		// ritorna il risultato
		return rs;
	} // end method
	
	public int getMaxID() {
		
		// valore di ritorno
		int resInt = 0;
		
		// imposta la query
		String sql_selectMaxID = "SELECT MAX(pID) FROM GANTT_MOV";
		
		// dichiara un resultSet
		ResultSet rs = null;

		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_selectMaxID);
			
			// esegue la query
			rs = comando.executeQuery();
			
			if (rs != null) {
				while(rs.next()) {
					resInt = rs.getInt(1);
				}
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		
		
		// ritorna il risultato
		return resInt;
	} // end method

	
	// METODI CHE CONVERTONO IL RISULTATO IN ARRAYLIST
	public ArrayList<Elenco> selectAllFromElenco() {
		// alloca la lista vuota per gli oggetti Elenco
		ArrayList<Elenco> listaElenco = new ArrayList<Elenco>();
		
		// carico i dati in memoria entro il ResultSet
		ResultSet rs = this.selectAll();

		
		try {
			while (rs.next()) {
				// crea oggetto con dentro i dati del record corrente
				Elenco tempElenco =
					new Elenco(
							rs.getInt("pID"), 
							rs.getString("pName"), 
							rs.getString("pStart"), 
							rs.getString("pEnd"),
							rs.getString("pColor"),
							rs.getString("pLink"),
							rs.getInt("pMile"),
							rs.getString("pRes"),
							rs.getInt("pComp"),
							rs.getInt("pGroup"),
							rs.getInt("pParent"),
							rs.getInt("pOpen"),
							rs.getString("pDepend"),
							rs.getString("pCaption"));
				
				// aggiunge oggetto creato in fondo alla lista
				listaElenco.add(tempElenco);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return listaElenco;
	}

	public ArrayList<Elenco> selectByKeyFromElenco(String p_nomeChiave, String p_valoreChiave) {
		// alloca la lista vuota per gli oggetti Elenco
		ArrayList<Elenco> listaElenco = new ArrayList<Elenco>();
		
		// carico i dati in memoria entro il ResultSet
		ResultSet rs = this.selectByChiave(p_nomeChiave, p_valoreChiave);

		
		try {
			while (rs.next()) {
				// crea oggetto con dentro i dati del record corrente
				Elenco tempElenco =
					new Elenco(
							rs.getInt("pID"), 
							rs.getString("pName"), 
							rs.getString("pStart"), 
							rs.getString("pEnd"),
							rs.getString("pColor"),
							rs.getString("pLink"),
							rs.getInt("pMile"),
							rs.getString("pRes"),
							rs.getInt("pComp"),
							rs.getInt("pGroup"),
							rs.getInt("pParent"),
							rs.getInt("pOpen"),
							rs.getString("pDepend"),
							rs.getString("pCaption"));
				
				// aggiunge oggetto creato in fondo alla lista
				listaElenco.add(tempElenco);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return listaElenco;
	}

	public Elenco selectByIdFromElenco(int p_ID) {
		Elenco resElenco = new Elenco();
		
		ResultSet rs = this.selectByID(p_ID);
		
		try {
			while (rs.next()) {
				// crea oggetto con dentro i dati del record corrente
				resElenco =
					new Elenco(
							rs.getInt("pID"), 
							rs.getString("pName"), 
							rs.getString("pStart"), 
							rs.getString("pEnd"),
							rs.getString("pColor"),
							rs.getString("pLink"),
							rs.getInt("pMile"),
							rs.getString("pRes"),
							rs.getInt("pComp"),
							rs.getInt("pGroup"),
							rs.getInt("pParent"),
							rs.getInt("pOpen"),
							rs.getString("pDepend"),
							rs.getString("pCaption"));
				
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return resElenco;

	}

	
	// METODI DML 
	// INSERT
	public int insertNewRecord(Elenco p_elenco) {
		// imposta la query con il nome del campo usato come chiave
		String sql_insert = 
			"INSERT INTO GANTT_MOV (pID, pName, pStart, pEnd, pColor, pLink, pMile, pRes, pComp, pGroup, pParent, pOpen, pDepend, pCaption) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		
		int resInt = 0;
		
		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_insert);
			
			// inserisce il parametro
			comando.setInt(1, p_elenco.getpID());
			comando.setString(2, p_elenco.getpName());
			comando.setString(3, p_elenco.getpStart());
			comando.setString(4, p_elenco.getpEnd());
			comando.setString(5, p_elenco.getpColor());
			comando.setString(6, p_elenco.getpLink());
			comando.setInt(7, p_elenco.getpMile());
			comando.setString(8, p_elenco.getpRes());
			comando.setInt(9, p_elenco.getpComp());
			comando.setInt(10, p_elenco.getpGroup());
			comando.setInt(11, p_elenco.getpParent());
			comando.setInt(12, p_elenco.getpOpen());
			comando.setString(13, p_elenco.getpDepend());
			comando.setString(14, p_elenco.getpCaption());
			
			
			// esegue la query
			 resInt = comando.executeUpdate();			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		return resInt;
	}
	
	
	// UPDATE
	public int updateRecord(Elenco p_elenco) {
		// imposta la query con il nome del campo usato come chiave
		String sql_update = 
			"UPDATE GANTT_MOV SET pName = ?, pStart = ?, pEnd = ?, pColor = ?, pLink = ?, pMile = ?, pRes = ?, pComp = ?, pGroup = ?, pParent = ?, pOpen = ?, pDepend = ?, pCaption = ? WHERE pID = ?";
		
		int resInt = 0;
		
		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_update);
			
			// inserisce il parametro
			
			comando.setString(1, p_elenco.getpName());
			comando.setString(2, p_elenco.getpStart());
			comando.setString(3, p_elenco.getpEnd());
			comando.setString(4, p_elenco.getpColor());
			comando.setString(5, p_elenco.getpLink());
			comando.setInt(6, p_elenco.getpMile());
			comando.setString(7, p_elenco.getpRes());
			comando.setInt(8, p_elenco.getpComp());
			comando.setInt(9, p_elenco.getpGroup());
			comando.setInt(10, p_elenco.getpParent());
			comando.setInt(11, p_elenco.getpOpen());
			comando.setString(12, p_elenco.getpDepend());
			comando.setString(13, p_elenco.getpCaption());
			comando.setInt(14, p_elenco.getpID());
			
			
			// esegue la query
			 resInt = comando.executeUpdate();			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		return resInt;
	}
	
	// DELETE
	public int deleteRecord(int p_ID) {
		// imposta la query con il nome del campo usato come chiave
		String sql_delete = 
			"DELETE FROM GANTT_MOV WHERE pID = ?";
		
		int resInt = 0;
		
		try {
			// crea lo statement associato alla query			
			PreparedStatement comando = dbConnection.prepareStatement(sql_delete);
			
			// inserisce il parametro
			
			comando.setInt(1, p_ID);
			
			// esegue la query
			 resInt = comando.executeUpdate();			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("ANALISI DELL'ERRORE");
			System.out.println(e.getMessage());
			System.out.println("FINE ANALISI DELL'ERRORE");
			//e.printStackTrace();
			
		}
		
		return resInt;
	}
	
	
} // end class
